﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using csNotificaciones;

namespace MotorMetricas.Logica
{
    public class MetricaNumeroAtributos : AbstractMetrica
    {
        override public int Generar(string ruta)
        {
            ManejoArchivo Manejador = new ManejoArchivo();
            ArrayList misarchivos = null;
            Boolean SinError = true;
            int NumeroAtributos = 0;

            if (Manejador.ValidarRuta(ruta))
            {
                /*
                 * el metodo ObtenerArchivos devuelve el Array de strings con las direcciones
                 * de todos los archivos a evaluar, recorriendo todas las subcarpetas
                 */
                misarchivos = Manejador.ObtenerArchivos(ruta);
            }
            else
            {
                SinError = false;
                //Console.WriteLine("Error: Ruta invalida");
            }

            if (SinError)
            {
                foreach (String rutaArchivo in misarchivos)
                {
                    int temp = 0;
                    if (Manejador.ValidarArchivo(rutaArchivo))
                    {
                        temp = ContarNumeroAtributos(rutaArchivo);
                        NumeroAtributos = NumeroAtributos + temp;
                    }
                }
            }
            Notificacion.mostrarVentana("Metrica de Numero de Atributos", "La metrica se ha generado con éxito\nResultado: " + NumeroAtributos.ToString(), Notificacion.Imagen.Ok, 2);
            return NumeroAtributos;
        }

        static public int ContarNumeroAtributos(string rutaArchivo)
        {
            int numero = 0; //contador del numero de atributos
            string linea = null;
            int llaves = 0; // contador de los bloques del proyecto

            try
            {
                StreamReader archivo = new StreamReader(rutaArchivo);

                while ((linea = archivo.ReadLine()) != null)
                {
                    if (linea.Contains("{"))
                    {
                        llaves = llaves + 1;
                    }
                    else
                    {
                        if (llaves == 2) // aqui verifico justamente que se esta abriendo el bloque de la clase
                        {
                            if (linea.Contains(";")) //si esta en el bloque de la clase y termina en ";" es un atributo
                                numero = numero + 1;

                            if (linea.Contains("abstract"))
                                numero = numero - 1;
                        }
                        else if (linea.Contains("}")) //llevo el contador de los bloques
                        {
                            llaves--;
                            if (llaves.Equals(1)) //esto por si no pusieron los atributos al principio sino que los pusieron al final
                            {
                                if (linea.Contains(";"))
                                    numero = numero + 1;
                                
                                if (linea.Contains("abstract"))
                                    numero = numero - 1;
                            }
                            else if (llaves.Equals(0))
                                break;
                        }

                    }
                }
                archivo.Close();
            }
            catch (Exception)
            {
                Notificacion.mostrarVentana("Metrica de Numero de Atributos", "Ha ocurrido un error al generar esta metrica", Notificacion.Imagen.Error, 1);
            }
            return numero;
        }
    }
}
                      
   

           

                 

